package com.audaque.springboot.foshanupload.mp.handler.impl;

import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.schema.Column;
import org.apache.commons.collections4.ListUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author zgb
 * @desc ...
 * @date 2023-04-05 16:39:56
 */
@Component
public class DiyTenantLineHandlerImpl implements TenantLineHandler {




    @Value("${db.tenantId}")
    private String tenantId;


    @Value("${db.tenantIdColumn}")
    private String tenantIdColumn;

    /**
     * 需要忽略拼接多租户条件的表名
     */
    @Value("#{'${mybatis-plus.configuration.diy.ignore-tenant-tables:}'.split(',')}")
    private List<String> ignoreTenantTables;


    @Value("${mybatis-plus.global-config.db-config.column-format}")
    private String columnFormat;


    public String getTenantIdColumn() {
        String tid=  tenantIdColumn;
        int i = columnFormat.indexOf("%s");
        if(i<=0){
            return tid;
        }

        char c = columnFormat.charAt(i - 1);
        return c + tenantIdColumn + c;
    }

    @Override
    public Expression getTenantId() {
        //从当前用户拿到租户id
        return new LongValue(Long.valueOf(tenantId));
    }

    // 该 default 方法 默认返回 false 表示所有表都需要拼多租户条件
    // 如果有部分 sql 不需要加上租户ID条件.可以使用 @InterceptorIgnore(tenantLine = "true") 标注在 Mapper 接口的方法上
    // 而 @SqlParser(filter = true) 在 mybatis-plus 3.4 版本中标记为过时
    @Override
    public boolean ignoreTable(String tableName) {
        ignoreTenantTables = ListUtils.emptyIfNull(ignoreTenantTables);
        if (ignoreTenantTables.isEmpty()) {
            return false;
        }
        return ignoreTenantTables.stream().anyMatch((e) -> e.equalsIgnoreCase(tableName));
    }

    @Override
    public boolean ignoreInsert(List<Column> columns, String tenantIdColumn) {
        //insertBatchSomeColumn没有实现去重
        return columns.stream().map(Column::getColumnName).anyMatch((i) -> {
            return i.equalsIgnoreCase(tenantIdColumn);
        });
    }


}
